﻿using Max.PH5_2103A.Shopping.Frame.DAL;
using Max.PH5_2103A.Shopping.Frame.IRepository;

namespace Max.PH5_2103A.Shopping.Frame.Repository
{


    /*
     * T：泛指一切数据类型，只是一个占位符
     * 在泛型仓储层中，对T有要求，不是所有数据类型都符合。所以要对T进行限制 - -这就是泛型约束
     * 约束：
     * 1、接口约束
     * 2、类类型约束
     * 3、引用数据
     * 4、值类型
     * 5、new() -- 公共的无参的构造函数
     * 
     * **/

    /// <summary>
    /// 基本的CRUD仓储实现
    /// </summary>
    public class BaseRepository<T> : IBaseRepository<T> where T : class, new()
    {
        MyDbContext _context;

        public BaseRepository(MyDbContext context)
        {
            _context = context;
        }

        #region Delete

        //删除
        public void Delete(T model)
        {
            _context.Set<T>().Remove(model);
        }
        //批量删除
        public void Delete(List<T> list)
        {
            _context.Set<T>().RemoveRange(list);
        }
        #endregion

        #region Select

        //查询所有数据
        public IQueryable<T> GetAll()
        {
            try
            {
                var data = _context.Set<T>();
                return data;
            }
            catch (Exception)
            {

                throw;
            }

        }

        //查询一条数据
        public T GetFirstById(object id)
        {
            return _context.Set<T>().Find(id);
        }
        #endregion

        #region Insert

        //添加
        public void Insert(T model)
        {
            _context.Set<T>().Add(model);
        }

        //批量添加
        public void Insert(List<T> list)
        {
            _context.Set<T>().AddRange(list);
        }
        #endregion

        #region Update

        //修改一条
        public void Update(T model)
        {
            _context.Set<T>().Update(model);
        }

        //批量修改
        public void Update(List<T> list)
        {
            _context.Set<T>().UpdateRange(list);
        }
        #endregion
    }
}